home *** CD-ROM | disk | FTP | other *** search
/ Aminet 39 / Aminet 39 (2000)(Schatztruhe)[!][Oct 2000].iso / Aminet / gfx / misc / Splitmpeg.lha / Splitmpeg / src / util.h < prev   
Encoding:
C/C++ Source or Header  |  2000-07-22  |  11.0 KB  |  213 lines

  1. /*
  2.  * Copyright (c) 1992 The Regents of the University of California.
  3.  * All rights reserved.
  4.  *
  5.  * Permission to use, copy, modify, and distribute this software and its
  6.  * documentation for any purpose, without fee, and without written agreement is
  7.  * hereby granted, provided that the above copyright notice and the following
  8.  * two paragraphs appear in all copies of this software.
  9.  *
  10.  * IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR
  11.  * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT
  12.  * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE UNIVERSITY OF
  13.  * CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  14.  *
  15.  * THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES,
  16.  * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
  17.  * AND FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
  18.  * ON AN "AS IS" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATION TO
  19.  * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
  20.  *
  21.  * I can be contacted via
  22.  * Email: michael@ecel.uwa.edu.au
  23.  * Post: P.O. Box 506, NEDLANDS WA 6009, AUSTRALIA
  24.  *
  25.  * Amigaversion by Tobias Seiler in 1997
  26.  * Email: tabs@blader.com
  27.  */
  28.  
  29.  
  30. /* Macro for updating bit counter if analysis tool is on. */
  31. #ifdef ANALYSIS
  32. #define UPDATE_COUNT(numbits) bitCount += numbits
  33. #else
  34. #define UPDATE_COUNT(numbits)
  35. #endif
  36.  
  37. #define get_bits1(result)                                 \
  38. {                                                         \
  39.   if (bufLength < 2) {                                    \
  40.     correct_underflow();                                  \
  41.   }                                                       \
  42.   UPDATE_COUNT(1);                                        \
  43.   if (bitOffset < 31) {                                   \
  44.     *(result) = ((curBits & bitTest[bitOffset]) != 0);    \
  45.     bitOffset++;                                          \
  46.   }                                                       \
  47.   else {                                                  \
  48.     *(result) = (curBits & 0x00000001);                   \
  49.     bitOffset = 0;                                        \
  50.     bitBuffer++;                                          \
  51.     curBits = *bitBuffer;                                 \
  52.     bufLength--;                                          \
  53.   }                                                       \
  54. }
  55.  
  56. #define get_bits2(result)                                 \
  57. {                                                         \
  58.   if (bufLength < 2) {                                    \
  59.     correct_underflow();                                  \
  60.   }                                                       \
  61.   UPDATE_COUNT(2);                                        \
  62.   if (bitOffset < 30) {                                   \
  63.     *(result) = ((curBits & bitMask[bitOffset]) >>        \
  64.     (30-bitOffset));                                      \
  65.     bitOffset += 2;                                       \
  66.   }                                                       \
  67.   else if (bitOffset == 30) {                             \
  68.     *(result) = (curBits & 0x00000003);                   \
  69.     bitOffset = 0;                                        \
  70.     bitBuffer++;                                          \
  71.     curBits = *bitBuffer;                                 \
  72.     bufLength--;                                          \
  73.   }                                                       \
  74.   else {                                                  \
  75.     *(result) = (((curBits & 0x01) << 1) |                \
  76.     ((*(bitBuffer+1) & 0x80000000) != 0));                \
  77.     bitOffset = 1;                                        \
  78.     bitBuffer++;                                          \
  79.     curBits = *bitBuffer;                                 \
  80.     bufLength--;                                          \
  81.   }                                                       \
  82. }
  83.  
  84. #define get_bitsX(num, thresh, result)                    \
  85. {                                                         \
  86.   int OFFnum = (bitOffset - thresh);                      \
  87.   if (bufLength < 2) {                                    \
  88.     correct_underflow();                                  \
  89.   }                                                       \
  90.   UPDATE_COUNT(num);                                      \
  91.   if (OFFnum < 0) {                                       \
  92.     *(result) = ((curBits & bitMask[bitOffset]) >>        \
  93.     (-OFFnum));                                           \
  94.     bitOffset += num;                                     \
  95.   }                                                       \
  96.   else if (OFFnum == 0) {                                 \
  97.     *(result) = (curBits & bitMask[bitOffset]) << OFFnum; \
  98.     bitBuffer++;                                          \
  99.     curBits = *bitBuffer;                                 \
  100.     bufLength--;                                          \
  101.     bitOffset = 0;                                        \
  102.   }                                                       \
  103.   else {                                                  \
  104.     *(result) = (((curBits & bitMask[bitOffset]) << OFFnum) |   \
  105.     ((*(bitBuffer+1) & (nBitMask[OFFnum])) >> (32-OFFnum)));    \
  106.     bitBuffer++;                                          \
  107.     curBits = *bitBuffer;                                 \
  108.     bufLength--;                                          \
  109.     bitOffset = OFFnum;                                   \
  110.   }                                                       \
  111. }
  112.  
  113. #define get_bits3(result)  get_bitsX( 3, 29, result)
  114. #define get_bits4(result)  get_bitsX( 4, 28, result)
  115. #define get_bits5(result)  get_bitsX( 5, 27, result)
  116. #define get_bits6(result)  get_bitsX( 6, 26, result)
  117. #define get_bits7(result)  get_bitsX( 7, 25, result)
  118. #define get_bits8(result)  get_bitsX( 8, 24, result)
  119. #define get_bits9(result)  get_bitsX( 9, 23, result)
  120. #define get_bits10(result) get_bitsX(10, 22, result)
  121. #define get_bits11(result) get_bitsX(11, 21, result)
  122. #define get_bits12(result) get_bitsX(12, 20, result)
  123. #define get_bits13(result) get_bitsX(13, 19, result)
  124. #define get_bits14(result) get_bitsX(14, 18, result)
  125. #define get_bits15(result) get_bitsX(15, 17, result)
  126. #define get_bits16(result) get_bitsX(16, 16, result)
  127. #define get_bits17(result) get_bitsX(17, 15, result)
  128. #define get_bits18(result) get_bitsX(18, 14, result)
  129. #define get_bits19(result) get_bitsX(19, 13, result)
  130. #define get_bits20(result) get_bitsX(20, 12, result)
  131. #define get_bits21(result) get_bitsX(21, 11, result)
  132. #define get_bits22(result) get_bitsX(22, 10, result)
  133. #define get_bits23(result) get_bitsX(23,  9, result)
  134. #define get_bits24(result) get_bitsX(24,  8, result)
  135. #define get_bits25(result) get_bitsX(25,  7, result)
  136. #define get_bits26(result) get_bitsX(26,  6, result)
  137. #define get_bits27(result) get_bitsX(27,  5, result)
  138. #define get_bits28(result) get_bitsX(28,  4, result)
  139. #define get_bits29(result) get_bitsX(29,  3, result)
  140. #define get_bits30(result) get_bitsX(30,  2, result)
  141. #define get_bits31(result) get_bitsX(31,  1, result)
  142. #define get_bits32(result) get_bitsX(32,  0, result)
  143.  
  144. #define get_bitsn(num, result) get_bitsX((num),(32-(num)),result)
  145.  
  146. #define show_bitsX(num, thresh, result)                                   \
  147. {                                                                         \
  148.   int OFFnum = (bitOffset - thresh);                                      \
  149.   if (bufLength < 2) {                                                    \
  150.     correct_underflow();                                                  \
  151.   }                                                                       \
  152.   if (OFFnum <= 0) {                                                      \
  153.     *(result) = ((curBits & bitMask[bitOffset]) >> (-OFFnum));            \
  154.   }                                                                       \
  155.   else {                                                                  \
  156.     *(result) = (((curBits & bitMask[bitOffset]) << OFFnum) |             \
  157.     ((*(bitBuffer+1) & (nBitMask[OFFnum])) >> (32-OFFnum)));              \
  158.   }                                                                       \
  159. }
  160.  
  161. #define show_bits1(result)  show_bitsX(1,  31, result)
  162. #define show_bits2(result)  show_bitsX(2,  30, result)
  163. #define show_bits3(result)  show_bitsX(3,  29, result)
  164. #define show_bits4(result)  show_bitsX(4,  28, result)
  165. #define show_bits5(result)  show_bitsX(5,  27, result)
  166. #define show_bits6(result)  show_bitsX(6,  26, result)
  167. #define show_bits7(result)  show_bitsX(7,  25, result)
  168. #define show_bits8(result)  show_bitsX(8,  24, result)
  169. #define show_bits9(result)  show_bitsX(9,  23, result)
  170. #define show_bits10(result) show_bitsX(10, 22, result)
  171. #define show_bits11(result) show_bitsX(11, 21, result)
  172. #define show_bits12(result) show_bitsX(12, 20, result)
  173. #define show_bits13(result) show_bitsX(13, 19, result)
  174. #define show_bits14(result) show_bitsX(14, 18, result)
  175. #define show_bits15(result) show_bitsX(15, 17, result)
  176. #define show_bits16(result) show_bitsX(16, 16, result)
  177. #define show_bits17(result) show_bitsX(17, 15, result)
  178. #define show_bits18(result) show_bitsX(18, 14, result)
  179. #define show_bits19(result) show_bitsX(19, 13, result)
  180. #define show_bits20(result) show_bitsX(20, 12, result)
  181. #define show_bits21(result) show_bitsX(21, 11, result)
  182. #define show_bits22(result) show_bitsX(22, 10, result)
  183. #define show_bits23(result) show_bitsX(23,  9, result)
  184. #define show_bits24(result) show_bitsX(24,  8, result)
  185. #define show_bits25(result) show_bitsX(25,  7, result)
  186. #define show_bits26(result) show_bitsX(26,  6, result)
  187. #define show_bits27(result) show_bitsX(27,  5, result)
  188. #define show_bits28(result) show_bitsX(28,  4, result)
  189. #define show_bits29(result) show_bitsX(29,  3, result)
  190. #define show_bits30(result) show_bitsX(30,  2, result)
  191. #define show_bits31(result) show_bitsX(31,  1, result)
  192. #define show_bits32(result) show_bitsX(32,  0, result)
  193.  
  194. #define show_bitsn(num,result) show_bitsX((num),(32-(num)),result)
  195.  
  196. #define flush_bits(num)                                               \
  197. {                                                                     \
  198.   if (BitStream == NULL) {                                            \
  199.     longjmp(env,ERR_NO_BIT_STREAM);                                   \
  200.   }                                                                   \
  201.   if (bufLength < 2) {                                                \
  202.     correct_underflow();                                              \
  203.   }                                                                   \
  204.   UPDATE_COUNT(num);                                                  \
  205.   bitOffset += num;                                                   \
  206.   if (bitOffset > 31) {                                               \
  207.     bitBuffer++;                                                      \
  208.     curBits = *bitBuffer;                                             \
  209.     bufLength--;                                                      \
  210.     bitOffset -= 32;                                                  \
  211.   }                                                                   \
  212. }
  213.